/*
 * 问题：有序数组中查找目标值的最大下标
 * 描述：给定一个升序排列的数组，对多个查询目标值，
 *       找到每个目标值在数组中出现的最大下标（下标从1开始计数），
 *       若目标值不存在，返回-1。
 * 示例：
 *   输入数组：[-2, -2, -2, 1]
 *   查询目标：-2、-2、-1
 *   输出：3 3 -1
 */

#include <stdio.h>

// 二分查找函数：返回目标值在数组中出现的最大下标（从1开始），未找到返回-1
// 参数：
//   arr[]: 升序排列的数组
//   n: 数组长度
//   key: 目标值
int binarySearch(int arr[], int n, int key) {
    int left = 0;         // 查找范围左边界（数组下标，从0开始）
    int right = n - 1;    // 查找范围右边界（数组下标，从0开始）
    int result = -1;      // 存储结果，初始为-1（未找到）

    // 循环查找，当左边界不超过右边界时继续
    while (left <= right) {
        // 计算中间位置（避免(left+right)溢出）
        int mid = left + (right - left) / 2;

        if (arr[mid] == key) {
            // 找到目标值：记录当前下标（+1转换为1开始计数）
            result = mid + 1;
            // 关键操作：继续向右查找更大的下标（因要找最大下标）
            left = mid + 1;
        } else if (arr[mid] < key) {
            // 中间值小于目标值：目标值在右半部分，调整左边界
            left = mid + 1;
        } else {
            // 中间值大于目标值：目标值在左半部分，调整右边界
            right = mid - 1;
        }
    }

    return result;  // 返回最大下标或-1
}

int main() {
    int N;  // 数组长度
    // 读取数组长度
    scanf("%d", &N);

    int arr[30000];  // 存储数组元素（题目约束N≤30000）
    // 读取数组元素（升序排列）
    for (int i = 0; i < N; i++) {
        scanf("%d", &arr[i]);
    }

    int T;  // 查询次数
    // 读取查询次数
    scanf("%d", &T);

    int keys[30000];  // 存储查询的目标值（题目约束T≤30000）
    // 读取所有查询目标
    for (int i = 0; i < T; i++) {
        scanf("%d", &keys[i]);
    }

    // 对每个目标值执行二分查找并输出结果
    for (int i = 0; i < T; i++) {
        int res = binarySearch(arr, N, keys[i]);
        printf("%d ", res);
    }
    printf("\n");  // 换行结束

    return 0;
}
    